package org.inspiration.dudu.content.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.inspiration.dudu.content.model.entity.AnswerEntity;
import org.inspiration.dudu.content.model.vo.AnswerVO;

import java.util.List;

/**
 * AnswerMapper 接口用于处理与答案相关的数据库操作。
 */
@Mapper
public interface AnswerMapper extends BaseMapper<AnswerEntity> {
    /**
     * 根据问题ID获取所有答案，按创建时间升序排列。
     *
     * @param questionId 问题ID
     * @param offset     偏移量
     * @param pageSize   每页大小
     * @return 答案列表
     */
    @Select("select * from answer where parent_id = #{questionId} order by created_at asc limit #{offset}, #{pageSize}")
    List<AnswerEntity> getAnswersByQuestionIdOrderByASC(String questionId, Integer offset, Integer pageSize);

    /**
     * 根据问题ID获取所有答案，按创建时间降序排列。
     *
     * @param questionId 问题ID
     * @param offset     偏移量
     * @param pageSize   每页大小
     * @return 答案列表
     */
    @Select("select * from answer where parent_id = #{questionId} order by created_at desc limit #{offset}, #{pageSize}")
    List<AnswerEntity> getAnswersByQuestionIdOrderByDESC(String questionId, Integer offset, Integer pageSize);

    /**
     * 增加答案的点赞数。
     *
     * @param contentId 答案ID
     */
    @Update("update answer set like_count = like_count + 1 where id = #{contentId}")
    void increaseLikeCount(String contentId);

    /**
     * 减少答案的点赞数。
     *
     * @param contentId 答案ID
     */
    @Update("update answer set like_count = like_count - 1 where id = #{contentId}")
    void decreaseLikeCount(String contentId);

    /**
     * 根据答案ID获取用户ID。
     *
     * @param contentId 答案ID
     * @return 用户ID
     */
    @Select("select user_id from answer where id = #{contentId}")
    Long getUserIdByContentId(String contentId);

    /**
     * 增加答案的收藏数。
     *
     * @param contentId 答案ID
     */
    @Update("update answer set favorite_count = favorite_count + 1 where id = #{contentId}")
    void increaseFavoriteCount(String contentId);

    /**
     * 减少答案的收藏数。
     *
     * @param contentId 答案ID
     */
    @Update("update answer set favorite_count = favorite_count - 1 where id = #{contentId}")
    void decreaseFavoriteCount(String contentId);

    /**
     * 创建新的答案。
     *
     * @param answerEntity 答案实体
     */
    @Insert("insert into answer (id, content_file_path, user_id, parent_id) values (#{id}, #{contentFilePath}, #{userId}, #{parentId})")
    void createAnswer(AnswerEntity answerEntity);

    /**
     * 增加答案的评论数。
     *
     * @param contentId 答案ID
     */
    @Update("update answer set comment_count = comment_count + 1 where id = #{contentId}")
    void increaseCommentCount(String contentId);

    /**
     * 根据答案ID获取答案实体。
     *
     * @param contentId 答案ID
     * @return 答案实体
     */
    @Select("select * from answer where id = #{contentId}")
    AnswerEntity getAnswerByContentId(String contentId);

    /**
     * 更新答案的点赞数。
     *
     * @param id        答案ID
     * @param likeCount 新的点赞数
     */
    @Update("update answer set like_count = #{likeCount} where id = #{id}")
    void updateLikeCountById(String id, Long likeCount);

    /**
     * 更新答案的收藏数。
     *
     * @param id             答案ID
     * @param favoriteCount  新的收藏数
     */
    @Update("update answer set favorite_count = #{favoriteCount} where id = #{id}")
    void updateFavoriteCountById(String id, Long favoriteCount);

    /**
     * 更新答案的评论数。
     *
     * @param id            答案ID
     * @param commentCount  新的评论数
     */
    @Update("update answer set comment_count = #{commentCount} where id = #{id}")
    void updateCommentCountById(String id, Long commentCount);

    /**
     * 根据答案ID获取答案视图对象。
     *
     * @param id 答案ID
     * @return 答案视图对象
     */
    @Select("select * from answer where id = #{id}")
    AnswerVO getAnswerById(String id);

    @Select("select * from answer where user_id = #{userId} order by created_at desc limit #{offset}, #{pageSize}")
    List<AnswerEntity> getAnswersByUserIdOrderByDESC(Long userId, Integer offset, Integer pageSize);
}
